package org.wupgame.service;

import org.springframework.data.domain.Page;
import org.springframework.transaction.annotation.Transactional;
import org.wupgame.model.Player;
import org.wupgame.model.Room;
import org.wupgame.model.RoomState;
import org.wupgame.model.RoomStateMsg;
import org.wupgame.model.dto.ActionDTO;
import org.wupgame.service.e.GameException;


public interface GameService {
	/**
	 * 创建新游戏
	 *
	 * @param creator  游戏创建者
	 * @param gameName 游戏名称
	 *
	 * @return 创建的游戏房间状态
	 */
	RoomState createNewGame(
		Player creator,
		String gameName,
		String password) throws GameException;
	
	/**
	 * 加入游戏
	 *
	 * @param roomId 房间ID
	 * @param player 玩家
	 *
	 * @return 更新后的房间状态
	 */
	RoomState joinGame(
		String roomId,
		Player player,
		String password) throws GameException;
	
	/**
	 * 开始游戏
	 *
	 * @param roomId 房间ID
	 * @param player 玩家
	 *
	 * @return 更新后的房间状态
	 */
	RoomState startGame(
		String roomId,
		Player player) throws GameException;
	
	/**
	 * 处理玩家操作的方法
	 *
	 * @param actionDTO 包含房间ID、玩家ID、卡片ID和所选颜色的数据传输对象
	 *
	 * @return RoomState 返回处理后的房间状态
	 * @throws GameException 如果游戏过程中出现异常则抛出
	 */
	@Transactional
	RoomStateMsg processPlayerAction(
		ActionDTO actionDTO) throws GameException;
	
	/**
	 * 退出游戏
	 *
	 * @param roomId 房间ID
	 * @param player 玩家
	 *
	 * @return 更新后的房间状态，如果游戏被删除则返回null
	 */
	RoomState leaveGame(
		String roomId,
		Player player) throws GameException;
	
	/**
	 * 获取可加入的游戏列表
	 *
	 * @return 可加入的游戏房间列表
	 */
	Page<Room> getAvailableGames(int pageNum);
	
	/**
	 * 获取玩家参与的所有游戏
	 *
	 * @param player 玩家
	 *
	 * @return 玩家参与的房间列表
	 */
	RoomState getPlayerGames(Player player);
}